package com.boilermaker.mq.common;

import com.boilermaker.mq.mqserver.core.Message;

import java.io.*;

// 任何实现了 Serializable 接口的 Java 对象都可以通过下面的工具类进行序列化与反序列化
public class BinaryTool {

    // 将对象序列化为字节数组
    public static byte[] toBytes(Object object) throws IOException {
        // 相当于一个字节数组，将序列化后的数据写入这个流对象，可以得到输出的字节数组
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        // 使用 Java 自带的序列化流对象
        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
            // Object -> ObjectOutputStream -> ByteArrayOutputStream -> byte[]
            objectOutputStream.writeObject(object);
        }
        return byteArrayOutputStream.toByteArray();
    }

    // 将字节数组反序列化为对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object;
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
        try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
            // byte[] -> ByteArrayInputStream -> ObjectInputStream -> Object
            object = objectInputStream.readObject();
        }
        return object;
    }
}
